package com.guli.gulimall.product.service.impl;

import com.guli.gulimall.product.dao.AttrDao;
import com.guli.gulimall.product.dao.SkuInfoDao;
import com.guli.gulimall.product.dao.SpuInfoDescDao;
import com.guli.gulimall.product.entity.*;
import com.guli.gulimall.product.service.*;
import com.guli.gulimall.product.vo.*;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.guli.common.utils.PageUtils;
import com.guli.common.utils.Query;

import com.guli.gulimall.product.dao.SpuInfoDao;

@SuppressWarnings("all")
@Service("spuInfoService")
public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoDao, SpuInfoEntity> implements SpuInfoService {

    @Autowired
    private SpuInfoDescDao spuInfoDescDao;

    @Autowired
    private SpuImagesService spuImagesService;

    @Autowired
    private AttrDao attrDao;

    @Autowired
    private ProductAttrValueService productAttrValueService;

    @Autowired
    private SkuInfoDao skuInfoDao;

    @Autowired
    private SkuImagesService skuImagesService;

    @Autowired
    private SkuSaleAttrValueService skuSaleAttrValueService;

    @Override
    public void saveSpu(SpuVo spuVo) {
        // --------------gulimall_pms（商品信息表）-------------
        // 1. spu表（商品的基本信息表）
        // pms_spu_info
        SpuInfoEntity spuInfoEntity = new SpuInfoEntity();
        BeanUtils.copyProperties(spuVo,spuInfoEntity);
        // 1.1 少了两个字段
        spuInfoEntity.setCreateTime(new Date());
        spuInfoEntity.setUpdateTime(new Date());
        // 1.2 同步数据库
        baseMapper.insert(spuInfoEntity);
        // 2. 商品的介绍信息表
        // pms_spu_info_desc  商品介绍的大图信息
        SpuInfoDescEntity spuInfoDescEntity = new SpuInfoDescEntity();
        spuInfoDescEntity.setSpuId(spuInfoEntity.getId());
        // 把集合的图片地址变成字符串
        List<String> decript = spuVo.getDecript();
        String url = "";
        if (!decript.isEmpty()){
            for (String s : decript) {
                url+=","+s;
            }
            // 从第一个开始截取
            url = url.substring(1);
            spuInfoDescEntity.setDecript(url);
        }
        spuInfoDescDao.insert(spuInfoDescEntity);
        // 3. 商品的图片信息（包括所有的sku的小图）
        // pms_spu_images
        List<String> images = spuVo.getImages();
        if (!images.isEmpty()){
            // 最终给数据库存放的对象
            // dao层没有批量添加的方法 批量操作的方法都在service中
            List<SpuImagesEntity> collect = images.stream().map(img -> {
                SpuImagesEntity spuImagesEntity = new SpuImagesEntity();
                spuImagesEntity.setSpuId(spuInfoEntity.getId());
                spuImagesEntity.setImgUrl(img);
                return spuImagesEntity;
            }).collect(Collectors.toList());
            spuImagesService.saveBatch(collect);
        }
        // 4. 所有的sku信息都有相同的规格参数
        //    苹果13pro  蓝色  黑色
        //    电池信息  长宽高
        // pms_product_attr_value
        List<BaseAttrs> baseAttrs = spuVo.getBaseAttrs();
        if (!baseAttrs.isEmpty()){
            List<ProductAttrValueEntity> collect = baseAttrs.stream().map(item -> {
                // 把每个vo中的数据复制到productAttrValueEntity
                ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
                // 因为数据库需要存放6个字段,但是页面vo只给了3个
                // 剩余的3个字段需要自己查询
                productAttrValueEntity.setSpuId(spuInfoEntity.getId());
                productAttrValueEntity.setAttrId(item.getAttrId());
                productAttrValueEntity.setAttrValue(item.getAttrValues());
                productAttrValueEntity.setQuickShow(item.getShowDesc());
                productAttrValueEntity.setAttrSort(0);
                // 剩下两个字段 是否需要参与检索和属性名称
                AttrEntity attrEntity = attrDao.selectById(item.getAttrId());
                productAttrValueEntity.setAttrName(attrEntity.getAttrName());
                productAttrValueEntity.setSearchType(attrEntity.getSearchType());
                return productAttrValueEntity;
            }).collect(Collectors.toList());
            productAttrValueService.saveBatch(collect);
        }
        // feign调用
        // 8. 购物积分和成长积分（与spu有关）
        // sms_spu_bounds

        List<Skus> skus = spuVo.getSkus();
        if (!skus.isEmpty()){
            for (Skus sku : skus){
                // 每执行一次添加就会有一个新的主键
                // 写循环的作用是为了 属性和商品能对应
                // 5. 商品的详细信息表 sku表
                // pms_sku_info sku的主键没有
                SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
                skuInfoEntity.setSkuId(spuInfoEntity.getId());
                skuInfoEntity.setSkuName(sku.getSkuName());
                skuInfoEntity.setSkuDesc(spuInfoEntity.getSpuDescription());
                skuInfoEntity.setCatalogId(skuInfoEntity.getCatalogId());
                skuInfoEntity.setBrandId(spuInfoEntity.getBrandId());
                // 默认图
                List<Images> images1 = sku.getImages();
                if (!images1.isEmpty()){
                    String imgUrl = images1.stream().filter(item -> {
                        return item.getDefaultImg().equals(1);
                    }).findFirst().get().getImgUrl();
                    skuInfoEntity.setSkuDefaultImg(imgUrl);
                }

                skuInfoEntity.setSkuTitle(sku.getSkuTitle());
                skuInfoEntity.setSkuSubtitle(sku.getSkuSubtitle());
                skuInfoEntity.setPrice(sku.getPrice());
                skuInfoEntity.setSaleCount(0L);
                skuInfoDao.insert(skuInfoEntity);

                // 6. sku的图片信息（每个商品的小图）
                // pms_sku_images
                // 默认图
                List<Images> images2 = sku.getImages();
                if (!images2.isEmpty()){
                    List<SkuImagesEntity> collect = images1.stream().filter(item -> {
                        return StringUtils.isNotEmpty(item.getImgUrl());
                    }).map(item -> {
                        SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                        skuImagesEntity.setImgUrl(item.getImgUrl());
                        skuImagesEntity.setDefaultImg(item.getDefaultImg());
                        skuImagesEntity.setSkuId(skuInfoEntity.getSkuId());
                        return skuImagesEntity;
                    }).collect(Collectors.toList());
                    skuImagesService.saveBatch(collect);

                }

                // 7. 每个sku的销售属性
                // pms_sku_sale_attr_value
                List<Attr> attr = sku.getAttr();
                if (!attr.isEmpty()){
                    List<SkuSaleAttrValueEntity> collect = attr.stream().map(item -> {
                        SkuSaleAttrValueEntity skuSaleAttrValueEntity = new SkuSaleAttrValueEntity();
                        skuSaleAttrValueEntity.setAttrId(item.getAttrId());
                        skuSaleAttrValueEntity.setAttrValue(item.getAttrValue());
                        skuSaleAttrValueEntity.setAttrSort(0);
                        skuSaleAttrValueEntity.setSkuId(skuInfoEntity.getSkuId());
                        skuSaleAttrValueEntity.setAttrName(item.getAttrName());
                        AttrEntity attrEntity = attrDao.selectById(item.getAttrId());
                        skuSaleAttrValueEntity.setSearchType(attrEntity.getSearchType());
                        return skuSaleAttrValueEntity;
                    }).collect(Collectors.toList());
                    // 批量添加销售属性
                    skuSaleAttrValueService.saveBatch(collect);
                }
                // ------------------------------------
                // sms数据库  优惠券数据库


                // 9. sku的打折信息表
                // sms_sku_ladder

                // 10. sku的满减表
                // sms_sku_full_reduction

                // 11. 会员价格表
                // sms_member_price

            }
        }



    }


    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<SpuInfoEntity> page = this.page(
                new Query<SpuInfoEntity>().getPage(params),
                new QueryWrapper<SpuInfoEntity>()
        );

        return new PageUtils(page);
    }

}